/*
 * HastaDenetci.java
 */
package eDoktor;

import eDoktor.doktor.Doktor;
import eDoktor.hasta.Hasta;
import eDoktor.hasta.Vaka;
import eDoktor.hastalik.AcilDurum;
import eDoktor.hastalik.Hastalik;
import eDoktor.hastalikGrubu.HastalikGrubu;
import eDoktor.hastalikGrubu.Soru;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

@ManagedBean(name = "HastaDenetci")
@SessionScoped

/**
 * Hasta denetçi sınıfı
 * Bu sınıf hasta ile ilgili arayüz işlemlerinin gerçekleşmesini sağlar.
 * @author Onuralp
 */
public class HastaDenetci implements Serializable {
    private String kullaniciAdi;
    private String sifre;
    private String girisMesaji;
    private Hasta hasta;
    private List<HastalikGrubu> hastalikGruplari;
    private HastalikGrubu secilenHastalikGrubu;
    private Hastalik hastalik;
    private String tavsiye;
    private List<Doktor> doktorlar;
    private String eskiSifre;
    private String yeniSifre;
    private String yeniSifreYeniden;
    private List<AcilDurum> acilDurumlar;
    
    /**
     * HastaDenetci sınıfının yapılandırıcısı
     */
    public HastaDenetci() {
        kullaniciAdi = "";
        sifre = "";
        girisMesaji = "";
        hasta = new Hasta();
        hastalikGruplari = new ArrayList<HastalikGrubu>();
        secilenHastalikGrubu = new HastalikGrubu();
        hastalik = new Hastalik();
        tavsiye = "";
        doktorlar = new ArrayList<Doktor>();
        eskiSifre = "";
        yeniSifre = "";
        yeniSifreYeniden = "";
        acilDurumlar = new ArrayList<AcilDurum>();
    }
    
    /**
     * HastaDenetci sınıfının degiskenlerine erişmeyi sağlayan fonksiyonlar 
     */
    
    public String getKullaniciAdi() {
        return kullaniciAdi;
    }

    public void setKullaniciAdi(String kullaniciAdi) {
        this.kullaniciAdi = kullaniciAdi;
    }

    public String getSifre() {
        return sifre;
    }

    public void setSifre(String sifre) {
        this.sifre = sifre;
    }

    public String getGirisMesaji() {
        return girisMesaji;
    }

    public void setGirisMesaji(String girisMesaji) {
        this.girisMesaji = girisMesaji;
    }

    public Hasta getHasta() {
        return hasta;
    }

    public void setHasta(Hasta hasta) {
        this.hasta = hasta;
    }

    public List<HastalikGrubu> getHastalikGruplari() {
        return hastalikGruplari;
    }

    public void setHastalikGruplari(List<HastalikGrubu> hastalikGruplari) {
        this.hastalikGruplari = hastalikGruplari;
    }

    public HastalikGrubu getSecilenHastalikGrubu() {
        return secilenHastalikGrubu;
    }

    public void setSecilenHastalikGrubu(HastalikGrubu secilenHastalikGrubu) {
        this.secilenHastalikGrubu = secilenHastalikGrubu;
    }

    public Hastalik getHastalik() {
        return hastalik;
    }

    public void setHastalik(Hastalik hastalik) {
        this.hastalik = hastalik;
    }

    public String getTavsiye() {
        return tavsiye;
    }

    public void setTavsiye(String tavsiye) {
        this.tavsiye = tavsiye;
    }

    public List<Doktor> getDoktorlar() {
        return doktorlar;
    }

    public void setDoktorlar(List<Doktor> doktorlar) {
        this.doktorlar = doktorlar;
    }

    public String getYeniSifre() {
        return yeniSifre;
    }

    public void setYeniSifre(String yeniSifre) {
        this.yeniSifre = yeniSifre;
    }

    public String getYeniSifreYeniden() {
        return yeniSifreYeniden;
    }

    public void setYeniSifreYeniden(String yeniSifreYeniden) {
        this.yeniSifreYeniden = yeniSifreYeniden;
    }

    public String getEskiSifre() {
        return eskiSifre;
    }

    public void setEskiSifre(String eskiSifre) {
        this.eskiSifre = eskiSifre;
    }

    public List<AcilDurum> getAcilDurumlar() {
        return acilDurumlar;
    }

    public void setAcilDurumlar(List<AcilDurum> acilDurumlar) {
        this.acilDurumlar = acilDurumlar;
    }
    
    /**
     * Oturumu aç. 
     * @param actionEvent Oturum aç
     */
    public void oturumuAc(ActionEvent actionEvent) {  
        FacesMessage mesaj = null;
        boolean onay = false;
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();            
            if ((veriTabaniSurucusu.kullaniciBilgileriniAra(hasta, kullaniciAdi, sifre)) && (hasta.getKullaniciTuru().equals("Hasta"))) {
                onay = true;
            }
            if ((!kullaniciAdi.equals("")) && (!sifre.equals("")) && onay) {
                veriTabaniSurucusu.hastaAra(hasta);
                girisMesaji = hasta.girisMesaji();
                FacesContext.getCurrentInstance().getExternalContext().redirect("Hasta.xhtml");
            } 
            else {  
                mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Kullanıcı adı ve/veya parola yanlış", "");  
            }
            veriTabaniSurucusu.baglantiyiKes();
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
    } 
    
    /**
     * Oturumu kapat.
     * @param actionEvent Oturumu kapat
     */
    public void oturumuKapat(ActionEvent actionEvent) {
        kullaniciAdi = "";
        sifre = ""; 
        girisMesaji = "";
        eskiSifre = "";
        yeniSifre =  "";
        yeniSifreYeniden = "";
        hasta = new Hasta();
        hastalikGruplari.clear();
        secilenHastalikGrubu = new HastalikGrubu();
        hastalik = new Hastalik();
        tavsiye = "";
        doktorlar.clear();
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("HastaGiris.xhtml");
        } catch (IOException hata) {
            System.out.println("Hata(IOException): " + hata.getMessage());
        }
    }
    
    /**
     * Hastalık gruplarını görüntüle.
     * @param actionEvent Görüntüle
     */
    public void hastalikGruplariniGoruntule(ActionEvent actionEvent) {  
        FacesMessage mesaj = null;
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            hastalikGruplari = veriTabaniSurucusu.hastalikGrubuAra();
            if (!hastalikGruplari.isEmpty()) {
                FacesContext.getCurrentInstance().getExternalContext().redirect("HastaHastalikGruplari.xhtml");
            } 
            else {  
                mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Sistemde hastalık grubu bulunmuyor.", "");  
            }
            veriTabaniSurucusu.baglantiyiKes();
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
    } 
    
    /**
     * Hastalık grubuna ait soruları getir.
     * @return Sorular sayfası
     */
    public String sorulariGetir() {  
        FacesMessage mesaj = null;
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            veriTabaniSurucusu.soruAra(secilenHastalikGrubu);
            for (Soru soru : secilenHastalikGrubu.getSorular()) {
                veriTabaniSurucusu.cevapAra(soru);
            }
            if (!secilenHastalikGrubu.getSorular().isEmpty()) {
                FacesContext.getCurrentInstance().getExternalContext().redirect("HastaSorular.xhtml");
            } 
            else {  
                mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Sistemde hastalık grubuna ait soru bulunmuyor.", "");  
            }
            veriTabaniSurucusu.baglantiyiKes();
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
        return "";
    } 
    
    /**
     * Hastanın sorulara verdiği cevapları değerlendir.
     * @param actionEvent Görüntüle
     */
    public void cevaplariDegerlendir(ActionEvent actionEvent) {
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            for (Soru soru : secilenHastalikGrubu.getSorular()) {
                veriTabaniSurucusu.cevapAra(soru.getCevap());
                veriTabaniSurucusu.hastaliklarinBelirtileriniAra(soru);
                soru.degerlendir();
            }
            secilenHastalikGrubu.setHastaliklar(veriTabaniSurucusu.hastaliklarinBelirtileriniAra(secilenHastalikGrubu.getSorular()));
            hastalik = secilenHastalikGrubu.degerlendir();
            tavsiye = hastalik.getTeshis().getTanim();
            doktorlar = veriTabaniSurucusu.doktorAra(hastalik.getTeshis().getUzmanlikAlani());
            veriTabaniSurucusu.baglantiyiKes();
            FacesContext.getCurrentInstance().getExternalContext().redirect("HastaDegerlendir.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    } 
    
    /**
     * Vakayı kaydet.
     * @param actionEvent Kaydet
     */
    public void vakayiKaydet(ActionEvent actionEvent) {
        Vaka vaka = new Vaka();
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            vaka.setHastalik(hastalik);
            vaka.getHastaOykusu().setSorular(secilenHastalikGrubu.getSorular());
            veriTabaniSurucusu.vakaEkle(hasta, vaka);
            veriTabaniSurucusu.vakaAra(hasta, vaka);
            veriTabaniSurucusu.hastaOykusuEkle(vaka);
            veriTabaniSurucusu.baglantiyiKes();
            FacesContext.getCurrentInstance().getExternalContext().redirect("HastaGecmis.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Hastalık geçmişini görüntüle.
     * @param actionEvent Görüntüle
     */
    public void hastalikGecmisiniGoruntule(ActionEvent actionEvent) {  
        FacesMessage mesaj = null;
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            hasta.getVakalar().clear();
            veriTabaniSurucusu.vakaAra(hasta);
            if (!hasta.getVakalar().isEmpty()) {
                FacesContext.getCurrentInstance().getExternalContext().redirect("HastaGecmis.xhtml");
            } 
            else {  
                mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Geçmişe ait vaka bulunmuyor.", "");  
            }
            veriTabaniSurucusu.baglantiyiKes();
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
    } 
    
    /**
     * Hasta kayıt formunu görüntüle
     * @param actionEvent Görüntüle
     */
    public void hastaKayitFormunuGoruntule(ActionEvent actionEvent) {
        try {
          FacesContext.getCurrentInstance().getExternalContext().redirect("HastaKayit.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Hasta için hesap oluştur.
     * @param actionEvent Kaydet
     */
    public void hesabiOlustur(ActionEvent actionEvent) {
        FacesMessage mesaj = null;
        try {
            hasta.setKullaniciTuru("Hasta");
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            veriTabaniSurucusu.hastaEkle(hasta);
            veriTabaniSurucusu.baglantiyiKes();
            FacesContext.getCurrentInstance().getExternalContext().redirect("HastaGiris.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
    }
    
    /**
     * Şifreyi değiştir.
     * @param actionEvent Güncelle 
     */
    public void sifreyiDegistir(ActionEvent actionEvent) {
        FacesMessage mesaj = null;
        if(sifre.equals(eskiSifre)){
            if(yeniSifre.equals(yeniSifreYeniden)){
                hasta.setSifre(yeniSifre);
                try {
                    VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
                    veriTabaniSurucusu.baglantiyiKur();
                    veriTabaniSurucusu.kullaniciBilgileriGuncelle(hasta);
                    veriTabaniSurucusu.baglantiyiKes();
                    mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Şifreniz başarı ile değiştirildi.", "");
                } catch (Exception hata) {
                    System.out.println("Hata(Exception): " + hata.getMessage());
                }
            }
            else{
                mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Yeni parolalar uyuşmuyor.", "");
            }
        }
        else{
            mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Parola yanlış", "");
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
    }
    
    /**
     * Acil durumları görüntüle
     * @param actionEvent Görüntüle
     */
    public void acilDurumlariGoruntule(ActionEvent actionEvent) {
        try {
            AcilDurum bayilma = new AcilDurum("Bayılma");
            bayilma.getAciklamalar().add("Şahsı boylu boyunca yere uzatınız.");
            bayilma.getAciklamalar().add("Kravatını ve yakasını gevşetiniz.");
            bayilma.getAciklamalar().add("Ayılması için on dakika bekleyiniz.");
            bayilma.getAciklamalar().add("On dakika geçtiği halde baygınlık devam ederse, mutlaka hastayı bir doktora yetiştiriniz. Baygınlığın uzun sürmesi, bunun sıradan bir bayılma olmadığını gösterir.");
            acilDurumlar.add(bayilma);
            
            AcilDurum yanık = new AcilDurum("Yanık");
            yanık.getAciklamalar().add("Şahıs yanık etkenlerinden hemen uzaklaştırılmalıdır.");
            yanık.getAciklamalar().add("Yanık çamaşırlar tutuşmuşsa hemen yere yatırılıp üzerine bir çarşaf atılarak oksijenle teması kesilerek yanık söndürülmelidir.");
            yanık.getAciklamalar().add("Yanan elbiseler soyularak değil makasla kesilerek çıkarılmalıdır.");
            yanık.getAciklamalar().add("Yanığın derinliğini artırmamak ve ağrının dindirilmesi için çeşme suyuna batırılmış (ıslatılmış) bezler tatbik edilmelidir.Kesinlikle buz veya buzlu su tatbik edilmemelidir.");
            yanık.getAciklamalar().add("Yanık eğer kimyasal maddeler ile oluşmuşsa bol su ile yıkanarak madde ortamdan uzaklaştırılmalıdır.Ağır yanıklarda ağızdan gıda sınırlanmalıdır");
            yanık.getAciklamalar().add("Yanan hastaya yapılacak bu ilk işlemlerden sonra en yakın özel veya resmi sağlık kurumuna başvurularak oradan alınacak görüşe göre hareket edilmelidir.");
            acilDurumlar.add(yanık);
            
            AcilDurum kalpKrizi = new AcilDurum("Kalp Krizi");
            kalpKrizi.getAciklamalar().add("Hasta mutlaka hemen dinlen(diril)melidir; yürüyorsa durmalı, oturtulmalı veya yatırılmalıdır. Mümkünse hareket ettirilmemelidir. Hasta sakinleştirilmelidir.");
            kalpKrizi.getAciklamalar().add("Sıkı giysiler gevşetilir.");
            kalpKrizi.getAciklamalar().add("Dilaltı nitrogliserin (isordil, 5 mg ) verilir.");
            kalpKrizi.getAciklamalar().add("Gerekiyorsa (solunum ve kalp durmuşsa) CPR yapılır.");
            kalpKrizi.getAciklamalar().add("Hastaneye götürülür ( mümkün olduğunca az hareket ettirilerek ).");
            acilDurumlar.add(kalpKrizi);
            
            AcilDurum koma = new AcilDurum("Koma");
            koma.getAciklamalar().add("ABC sürekli kontrol edilir (gerekiyorsa suni solunum, kalp masajı yapılır ).");
            koma.getAciklamalar().add("Soluk alıyorsa, koma pozisyonunda yatırılır.");
            koma.getAciklamalar().add("Hastaneye götürülür.");
            koma.getAciklamalar().add("Bilinci kapalı kişilerin üzerine soğuk su dökülmesi, şamarlanması, sarsılması (özellikle beyin kanaması veya kafa travmasında) tehlikeli olabileceğinden, bu gibi davranışlardan kesinlikle kaçınılmalıdır.");
            acilDurumlar.add(koma);
            
            AcilDurum sara = new AcilDurum("Sara (Epilepsi)");
            sara.getAciklamalar().add("Kişinin kendini yaralamaması için tedbir alınır; yatırılır, dilini ısırmaması için çene kenetlenmemişse, dişlerinin arasına bir şey konur (mendil, kalem vs gibi).");
            sara.getAciklamalar().add("Başını ve kollarını ritmik olarak bir yerlere vuruyorsa battaniye, ceket vb malzemelerle desteklenerek kendisini yaralaması engellenir.");
            acilDurumlar.add(sara);
            
            FacesContext.getCurrentInstance().getExternalContext().redirect("HastaAcilDurum.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
}
